package com.wf.netty.coder.string;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * 功能描述
 *
 * @author wf
 * @since 2022/5/26
 */
public class MyStringIntegerDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 可读字节小于4，消息头未完整，直接返回
        if (in.readableBytes() <= 4) {
            return;
        }
        // 消息头已完整，标记当前readIndex
        in.markReaderIndex();
        int length = in.readInt();

        // 从读取玩消息头后会导致readIndex读指针变化
        // 如果剩余长度不够消息体的大小，则需要重置读指针，下一次从相同的位置处理
        if (in.readableBytes() < length) {
            // 重置指针到消息头的readIndex处，下次从消息头处开始读取，也就是只有消息头和消息体都传输完成才开始读取整个消息
            in.resetReaderIndex();
            return;
        }

        // 读取数据
        byte[] bytes = new byte[length];
        in.readBytes(bytes, 0, length);
        out.add(new String(bytes, StandardCharsets.UTF_8));
    }
}
